/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package matematicadiscretaxml;

import arbol_prueba.BTree;
import arbol_prueba.BTreeException;
import java.util.ArrayList;
import java.util.Stack;

/**
 *
 * @author diego
 */
public class CreacionTablasCuerpo {

    ArrayList lista_lexemas = new ArrayList();
    private ArrayList lista_errores_create_cuerpo = new ArrayList();

    Stack pila_pal_reserv = new Stack();
    Stack pila_identifica = new Stack();
//    Stack pila_operadores = new Stack();
    Stack pila_simbolos = new Stack();


    public CreacionTablasCuerpo(){}

    public CreacionTablasCuerpo(ArrayList _lista_lexemas)
    {
        lista_lexemas = _lista_lexemas;
    }

    public void ingresarPilas()
    {
        boolean bandera_llave_abierta = false;
        boolean bandera_error = false;
        int indice_llave_abierta = -1;

        for(int i = 0; i < lista_lexemas.size(); i++)
        {
            if(!bandera_error)
            {
                if( ((Lexema)lista_lexemas.get(i)).getLexema().toLowerCase().equals("{") )
                {
                    bandera_llave_abierta = true;
                }
                if(bandera_llave_abierta == true)
                {
                    switch( ((Lexema)lista_lexemas.get(i)).getTipo_lexema() )
                    {
                        /*
                         * AQUI DEBE HABER UN ELSE YA QUE SOLO DEBEN HABER
                         * IDENTIFICADORES, OPERADORES, CONSTANTES CADENAS
                         *  Y CONSTANTES NUMEROS
                         */
                        case 1:
                            if( ((Lexema)lista_lexemas.get(i)).getLexema().toLowerCase().equals("varchar")
                                    || ((Lexema)lista_lexemas.get(i)).getLexema().toLowerCase().equals("double")
                                    || ((Lexema)lista_lexemas.get(i)).getLexema().toLowerCase().equals("primary")
                                    || ((Lexema)lista_lexemas.get(i)).getLexema().toLowerCase().equals("key")
                                    || ((Lexema)lista_lexemas.get(i)).getLexema().toLowerCase().equals("references")
                                  )
                            {
                                pila_pal_reserv.push(lista_lexemas.get(i));
                            }
                            else
                            {
                                bandera_error = true;
                                lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "EXISTEN PALABRAS RESERVADAS NO PERMITIDAS EN CREATE"));
                            }
                            
                            break;
                        case 2:
                             if( ((Lexema)lista_lexemas.get(i)).getLexema().toLowerCase().equals(",")
                                    || ((Lexema)lista_lexemas.get(i)).getLexema().toLowerCase().equals("{")
                                    || ((Lexema)lista_lexemas.get(i)).getLexema().toLowerCase().equals("}")
                                  )
                            {
                                 if(((Lexema)lista_lexemas.get(i)).getLexema().toLowerCase().equals("{"))
                                 {
                                     indice_llave_abierta = i;
                                 }
                                pila_simbolos.push(lista_lexemas.get(i));
                            }
                            else
                            {
                                bandera_error = true;
                                lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "EXISTEN SIMBOLOS NO PERMITIDOS EN CREATE"));
                            }
                            
                            break;
                        case 4:
                            if( buscarPuntoCadena(((Lexema)lista_lexemas.get(i)).getLexema().toLowerCase()) == 0)
                            {
                                pila_identifica.push(lista_lexemas.get(i));
                            }
                            else
                            {
                                bandera_error = true;
                                lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "NO DEBE EXISTIR PUNTOS EN CREATE"));
                            }
                            break;
                        default:
                            bandera_error = true;
                            lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "EXISTEN UN SIMBOLO NO PERMITIDO EN CREATE"));
                            break;
                    }
                }
            }
            
        }
        if(indice_llave_abierta == -1)
        {
            bandera_error = true;
            lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "NO SE ENCONTRO LA LLAVE ABIERTA EN CREATE"));
        }
        
    }


    public BTree generarSubArbolCuerpoCreate(BTree nodo_padre)
    {
        BTree nodo_aux = new BTree(null);

        if(nodo_padre.getElement() == "nulo")
        {
            if(!pila_simbolos.empty())
            {
                if(((Lexema)pila_simbolos.peek()).getLexema().toString().toLowerCase().equals("}"))
                {
                    nodo_aux = new BTree(pila_simbolos.pop());
                    try
                    {
                        nodo_aux.insertar(generarSubArbolCuerpoCreate(nodo_aux), BTree.LADO_DRCHO);
                        nodo_aux.insertar(generarSubArbolCuerpoCreate(nodo_aux), BTree.LADO_IZDO);
                    }
                    catch (BTreeException ex)
                    {
                        System.out.println(ex.getMessage());
                    }
                }
                else
                {
                    lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "FALTA UN SIMBOLO DE LLAVE "));
                }
            }
            else
            {
                lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "EL CONTENIDO DE CREATE DEBE ESTAR ENCERRADO POR LLAVES"));
            }
        }
        else
        {
            if( ((Lexema)nodo_padre.getElement()).getTipo_lexema() == 2 )
            {
                if( ((Lexema)nodo_padre.getElement()).getLexema().toLowerCase().equals("}") )
                {
                    if(nodo_padre.getDerecha() == null)
                    {
                        nodo_aux = new BTree(new Lexema(0, null));
                    }
                    else
                    {
                        if (!pila_simbolos.empty() || !pila_pal_reserv.empty())
                        {
                            if(!pila_simbolos.empty() && ((Lexema)pila_simbolos.peek()).getLexema().toLowerCase().equals(","))
                            {
                                nodo_aux = new BTree(pila_simbolos.pop());
                                try
                                {
                                    nodo_aux.insertar(generarSubArbolCuerpoCreate(nodo_aux), BTree.LADO_DRCHO);
                                    nodo_aux.insertar(generarSubArbolCuerpoCreate(nodo_aux), BTree.LADO_IZDO);
                                }
                                catch (BTreeException ex)
                                {
                                    System.out.println(ex.getMessage());
                                }
                            }
                            else if(!pila_pal_reserv.empty())
                            {
                                if(((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("varchar")
                                  || ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("double")
                                  ||  ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("key")
                                  ||  ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("references"))
                                {
                                    nodo_aux = new BTree(pila_pal_reserv.pop());
                                    try
                                    {
                                        nodo_aux.insertar(generarSubArbolCuerpoCreate(nodo_aux), BTree.LADO_DRCHO);
                                        nodo_aux.insertar(generarSubArbolCuerpoCreate(nodo_aux), BTree.LADO_IZDO);
                                    }
                                    catch (BTreeException ex)
                                    {
                                        System.out.println(ex.getMessage());
                                    }
                                }
                                else
                                {
                                    
                                    lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "FALTA UNA PALABRA RESERVADA"));
                                }
                                
                            }
                            else
                            {
                                lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "FALTA UNA PALABRA RESERVADA"));
                            }
                        }
                        else
                        {
                            lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "FALTA UNA PALABRA RESERVADA"));
                        }
                    }

                }
                else if( ((Lexema)nodo_padre.getElement()).getLexema().toLowerCase().equals("{") )
                {
                }
                else if( ((Lexema)nodo_padre.getElement()).getLexema().toLowerCase().equals(",") )
                {
                    
                    if(nodo_padre.getDerecha() == null)
                    {
                        if(!pila_pal_reserv.empty())
                        {
                            if(  ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("varchar")
                                  || ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("double")
                                  ||  ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("key")
                                  ||  ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("references")
                                  )
                            {
                                if(!pila_identifica.empty())
                                {
                                    nodo_aux = new BTree(pila_pal_reserv.pop());
                                    try
                                    {
                                        nodo_aux.insertar(generarSubArbolCuerpoCreate(nodo_aux), BTree.LADO_DRCHO);
                                        nodo_aux.insertar(generarSubArbolCuerpoCreate(nodo_aux), BTree.LADO_IZDO);
                                    }
                                    catch (BTreeException ex)
                                    {
                                        System.out.println(ex.getMessage());
                                    }
                                }
                                else
                                {
                                    lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "FALTAN IDENTIFICADORES"));
                                }

                            }
                            else
                            {
                                
                                lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "FALTAN PALABRAS RESERVADAS DE DEFINICION DE TIPO DE DATO"));
                            }

                        }
                        else
                        {
                            lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "FALTAN PALABRAS RESERVADAS EN CREATE"));
                        }
                    }
                    else
                    {
                        
                        if( !pila_simbolos.empty() || !pila_pal_reserv.empty())
                        {
                            if(!pila_simbolos.empty() )
                            {
                                if(((Lexema)pila_simbolos.peek()).getLexema().toLowerCase().equals(","))
                                {
                                    nodo_aux = new BTree(pila_simbolos.pop());
                                    try
                                    {
                                        nodo_aux.insertar(generarSubArbolCuerpoCreate(nodo_aux), BTree.LADO_DRCHO);
                                        nodo_aux.insertar(generarSubArbolCuerpoCreate(nodo_aux), BTree.LADO_IZDO);
                                    }
                                    catch (BTreeException ex)
                                    {
                                        System.out.println(ex.getMessage());
                                    }
                                }
                                else
                                {
                                    if(!pila_pal_reserv.empty() )
                                    {
                                        if(  ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("varchar")
                                          || ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("double")
                                          ||  ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("key")
                                          ||  ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("references")
                                          )
                                        {
                                            nodo_aux = new BTree(pila_pal_reserv.pop());
                                            try
                                            {
                                                nodo_aux.insertar(generarSubArbolCuerpoCreate(nodo_aux), BTree.LADO_DRCHO);
                                                nodo_aux.insertar(generarSubArbolCuerpoCreate(nodo_aux), BTree.LADO_IZDO);
                                            }
                                            catch (BTreeException ex)
                                            {
                                                System.out.println(ex.getMessage());
                                            }
                                        }
                                        else
                                        {
                                            lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "FALTAN PALABRAS RESERVADAS DE DEFINICION DE TIPO DE DATO"));
                                        }
                                    }
                                    else
                                    {
                                        lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "FALTAN SIMBOLOS DE COMA"));
                                    }
                                    
                                }
                                
                            }
                            else
                            {
                                if(  ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("varchar")
                                  || ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("double")
                                  ||  ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("key")
                                  ||  ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("references")
                                  )
                                {
                                    nodo_aux = new BTree(pila_pal_reserv.pop());
                                    try
                                    {
                                        nodo_aux.insertar(generarSubArbolCuerpoCreate(nodo_aux), BTree.LADO_DRCHO);
                                        nodo_aux.insertar(generarSubArbolCuerpoCreate(nodo_aux), BTree.LADO_IZDO);
                                    }
                                    catch (BTreeException ex)
                                    {
                                        System.out.println(ex.getMessage());
                                    }
                                }
                                else
                                {
                                    lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "FALTAN PALABRAS RESERVADAS DE DEFINICION DE TIPO DE DATO"));
                                }

                            }
                        }
                        else
                        {
                            lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "EXISTEN SIMBOLOS PROHIBIDOS EN CREATE"));
                        }
                    }

                }
                else
                {
                    lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "EXISTEN SIMBOLOS PROHIBIDOS EN CREATE"));
                }
            }
            else if( ((Lexema)nodo_padre.getElement()).getTipo_lexema() == 1 )
            {
                if( ((Lexema)nodo_padre.getElement()).getLexema().toLowerCase().equals("varchar")
                    || ((Lexema)nodo_padre.getElement()).getLexema().toLowerCase().equals("double") )
                {
                    if(nodo_padre.getDerecha() == null)
                    {
                        nodo_aux = new BTree(new Lexema(0, null));
                    }
                    else
                    {
                        if(!pila_identifica.empty())
                        {
                            nodo_aux = new BTree(pila_identifica.pop());
                            if( !pila_simbolos.empty())
                            {
                                if( ((Lexema)pila_simbolos.peek()).getLexema().toLowerCase().equals("{") && pila_pal_reserv.empty() )
                                {
                                    try
                                    {
                                        nodo_aux.insertar(new BTree(new Lexema(0, null)), BTree.LADO_DRCHO);
                                        nodo_aux.insertar(new BTree(pila_simbolos.pop()), BTree.LADO_IZDO);
                                    }
                                    catch (BTreeException ex)
                                    {
                                        System.out.println(ex.getMessage());
                                    }
                                }
                            }

                        }
                        else
                        {
                            lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "FALTA UN IDENTIFICADOR"));
                        }

                    }
                }
                else if(((Lexema)nodo_padre.getElement()).getLexema().toLowerCase().equals("key"))
                {
                    if(!pila_pal_reserv.empty())
                    {
                        if(nodo_padre.getDerecha()==null)
                        {
                            if( ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("primary") )
                            {
                                nodo_aux = new BTree(pila_pal_reserv.pop());
                            }
                            else
                            {
                                lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "FALTA LA PALABRA RESERVADA PRIMARY"));
                            }
                        }
                        else
                        {
                            if( ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("varchar")
                                || ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("double") )
                            {
                                nodo_aux = new BTree(pila_pal_reserv.pop());
                                try
                                {
                                    nodo_aux.insertar(generarSubArbolCuerpoCreate(nodo_aux), BTree.LADO_DRCHO);
                                    nodo_aux.insertar(generarSubArbolCuerpoCreate(nodo_aux), BTree.LADO_IZDO);
                                }
                                catch (BTreeException ex)
                                {
                                    System.out.println(ex.getMessage());
                                }
                            }
                            else
                            {
                                lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "FALTA LA PALABRA RESERVADA DE TIPO DE DATO"));
                            }
                            
                        }
                    }
                    else
                    {
                        lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "FALTA UNA PALABRA RESERVADA"));
                    }

                }
                else if(((Lexema)nodo_padre.getElement()).getLexema().toLowerCase().equals("primary"))
                {

                }
                else if(((Lexema)nodo_padre.getElement()).getLexema().toLowerCase().equals("references"))
                {
                    if(nodo_padre.getDerecha()==null)
                    {
                        if( !pila_identifica.empty())
                        {
                            nodo_aux = new BTree(pila_identifica.pop());
                        }
                        else
                        {
                            lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "FALTA UN IDENTIFICADOR"));
                        }
                    }
                    else
                    {
                        if( !pila_pal_reserv.empty())
                        {
                            if( ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("varchar")
                                || ((Lexema)pila_pal_reserv.peek()).getLexema().toLowerCase().equals("double") )
                            {
                                nodo_aux = new BTree(pila_pal_reserv.pop());
                                try
                                {
                                    nodo_aux.insertar(generarSubArbolCuerpoCreate(nodo_aux), BTree.LADO_DRCHO);
                                    nodo_aux.insertar(generarSubArbolCuerpoCreate(nodo_aux), BTree.LADO_IZDO);
                                }
                                catch (BTreeException ex)
                                {
                                    System.out.println(ex.getMessage());
                                }
                            }
                            else
                            {
                                lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "FALTA LA PALABRA RESERVADA DE TIPO DE DATO"));
                            }
                        }
                        else
                        {
                            lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "FALTA UNA PALABRA RESERVADA"));
                        }
                    }

                }
            }
            else if( ((Lexema)nodo_padre.getElement()).getTipo_lexema() == 4 )
            {
                if(nodo_padre.getDerecha() == null)
                {
                    nodo_aux = new BTree(new Lexema(0, null));
                }
                else
                {
                    if( !pila_simbolos.empty() )
                    {
                        if( ((Lexema)pila_simbolos.peek()).getLexema().toLowerCase().equals("{") )
                        {
                            nodo_aux = new BTree(pila_simbolos.pop());
                        }
                        else
                        {
                            lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "FALTA UNA LLAVE"));
                        }
                    }
                    else
                    {
                        lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "FALTA UNA LLAVE"));
                    }
                }
            }
            else
            {
                lista_errores_create_cuerpo.add(new Error("SENTENCIA CREATE", "EXISTE UN SIMBOLO NO IDENTIFICADO"));
            }
        }
        return nodo_aux;
    }

    public int buscarPuntoCadena(String cadena)
    {
        int numero_repitencia_punto = 0;
        for(int i = 0; i<cadena.length(); i++)
        {
            if(cadena.charAt(i) == '.')
            {
                numero_repitencia_punto++;
            }
        }
        return numero_repitencia_punto;
    }


    /**
     * @return the lista_errores_create_cuerpo
     */
    public ArrayList getlista_errores_create_cuerpo() {
        return lista_errores_create_cuerpo;
    }

    /**
     * @param lista_errores_create_cuerpo the lista_errores_create_cuerpo to set
     */
    public void setlista_errores_create_cuerpo(ArrayList lista_errores_create_cuerpo) {
        this.lista_errores_create_cuerpo = lista_errores_create_cuerpo;
    }

}
